from langgraph.prebuilt import ToolNode

from my_intelligent_customer.utils.tools import insurance_order_search, \
    is_insurance_order_refundable, insurance_order_cancel_authentication, insurance_order_cancel_amount, \
    work_order_create, insurance_order_type, insurance_order_cancel_long, insurance_order_cancel_short, save_reason

# 会话的核心目标
CONVERSATION_CORE_OBJECTIVE = "在尽可能挽留用户的同时，富有同理心的帮助进线用户操作系统完成本人保单的退保。"

# 定义角色信息
ROLE_INFO = {
    "name": "客服小依",
    "role": "客服",
    "company_name": "水滴保险",
    "company_business": """水滴保是水滴公司2017年5月推出的互联网保险平台，运营主体为水滴保险经纪有限公司，是保险监督管理部门批复的全国性保险经纪公司。公司一直以“提供更多高性价比的产品和更极致的服务体验”为使命。致力于用科技助推普惠保险，通过多种服务模式覆盖用户全生命周期的保障需求。
目前，水滴保已与国内超过60家知名保险公司达成合作，推出数百款高性价比优质保险产品。涉及医疗、重疾、意外、寿险、年金等人身健康险各类险种，覆盖少儿、成人、老人、慢病人群等各个群体。
根据调研数据显示，90%的用户通过水滴保完成个人首次在线投保，复购意愿高达73%，成为更多用户在购买保险上的优先选择。""",
    "company_values": "用户第一",
}

# 定义角色的执行阶段
CONVERSATION_STAGES = {"1": "明确用户是否退本人保单，不需要有额外话术。",
                       "2": "用户确认退本人的，提供当前用户在途的保单信息",
                       "3": "确认用户选择的退保保单是否AI可退，询问退保原因并保存",
                       "4": "保存用户提供的原因",
                       "5": "根据用户提供的姓名和身份证后四位进行身份验证",
                       "6": "校验用户是否认可退款金额和退保风险",
                       "7": "判断所退保单的品类（长险还是短险）",
                       }

# 各个SOP阶段更细致的提示词
CONVERSATION_STAGES_CORRESPONDING_PROMPT = {
    "1": """1、退非本人保单，则需告知用户需要本人操作
2、退本人保单，则进入下一阶段""",

    "2": """1、本人无保单的话，则需告知用户未查到
2、本人有保单的话，则需询问用户需要退哪个保单。保单信息分条带数字展示，只展示保险产品名称即可，无需返回其余的信息。""",

    "3": """1、确认用户选择的退保保单是否AI可退
2、不可退的话，则需告知用户告知需人工操作，用户同意的话，进行工单创建。
3、可退的话，则需询问用户退保原因。""",

    "4": """1、用户提供原因之后，调用工具保存用户提供的退保原因。
2、保存成功之后进入下一阶段，询问姓名、身份证后四位""",

    "5": """1、用户不告知，需要澄清必要性，继续索要，若还不提供，询问用户是否升级处理
2、用户告知，但是验证失败，继续索要，若还错误，询问用户是否升级处理
3、用户告知，并且验证成功，告知用户选择退保的保单的可退金额及退保风险，并让用户确认""",

    "6": """1、用户不认可，需要进行2次挽留动作
2、挽留2次失败，则进入下一阶段
3、挽留成功，生成结束语""",

    "7": """1、长险：发送退保链接
2、短险：再次询问用户是否确认退保，如果用户确认，则进行保单退保""",
}

# 各个SOP阶段可以使用的工具
CONVERSATION_STAGES_CORRESPONDING_TOOLS = {
    "1": [],
    "2": [insurance_order_search],
    "3": [is_insurance_order_refundable, work_order_create],
    "4": [save_reason],
    "5": [insurance_order_cancel_authentication, insurance_order_cancel_amount],
    "6": [],
    "7": [insurance_order_type, insurance_order_cancel_long, insurance_order_cancel_short],
}

tools = []
for value in CONVERSATION_STAGES_CORRESPONDING_TOOLS.values():
    tools = tools + value
tool_node = ToolNode(tools)
